////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                            //
//                                                         WNProject                                                          //
//                                                                                                                            //
//            This file is distributed under the BSD 2-Clause open source license. See License.txt for details.               //
//                                                                                                                            //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef __WN_VECTOR_4_H__
#define __WN_VECTOR_4_H__

#include "WNCore/inc/WNTypes.h"

namespace WNMath {
    class WNVector3;

    class WNVector4 {
    public:
        WNVector4();
        explicit WNVector4(WN_FLOAT32 _f);
        explicit WNVector4(const WN_FLOAT32* _f);
        explicit WNVector4(const WNVector3& _vector, WN_FLOAT32 _f);
        explicit WNVector4(WN_FLOAT32 _x, WN_FLOAT32 _y, WN_FLOAT32 _z, WN_FLOAT32 _w);

        operator WN_FLOAT32* ();
        operator const WN_FLOAT32* () const;

        WN_FLOAT32& operator () (WN_INT32 _index);
        WN_FLOAT32 operator () (WN_INT32 _index) const;

    public:
        union {
            struct {
                WN_FLOAT32 x;
                WN_FLOAT32 y;
                WN_FLOAT32 z;
                WN_FLOAT32 w;
            };

            WN_FLOAT32 raw[4];
        };
    };
}

#endif // __WN_VECTOR_4_H__